package cn.com.surker.util;

import cn.com.surker.spring.SpringContextHolder;
import com.baomidou.mybatisplus.annotation.TableName;
import org.springframework.jdbc.core.JdbcTemplate;

import java.lang.annotation.Annotation;
import java.util.Date;

/**
 * 实体类相关类
 * @author luotao
 * @date 2023/7/27
 */
public class EntityUtils {

	// 入库记录前缀
	public static String MATERIAL_STORAGE_PREFIX = "RK";
	//	领用记录编码前缀
	public static String MATERIAL_OUTBOUND_PREFIX = "LY";
	//	签订的合同编号
	public static String MATERIAL_MARKET_CONTRACT_PREFIX = "HT";

	/**
	 * 获取自增长编号
	 * @param prefix			前缀
	 * @param clazz				该实体类
	 * @return
	 */
	public static String generateCode(String prefix, Class clazz){
		String tableName = getTableName(clazz);
		String generate = generateCode(prefix, tableName);
		return generate;
	}

	/**
	 * 获取子自增长编号
	 * @param prefix			前缀
	 * @param tableName			表明
	 * @return
	 */
	public static String generateCode(String prefix, String tableName){
		String code = prefix;
		String s = DateUtil.convertString(new Date(), "yyyy-MM-dd");
		if(StringUtils.isNotBlank(code)){
			code += "-";
		}
		code += s;
		JdbcTemplate oaMysqlJdbcTemplate = SpringContextHolder.getBean("mysqlJdbcTemplate");
		String sql = "select max(id) from " + tableName + " where status = 0";
		Long maxId = oaMysqlJdbcTemplate.queryForObject(sql, Long.class);
		if(maxId == null){
			maxId = 0l;
		}
		maxId = MathUtils.add(maxId,1l);
		String end = StringUtils.toFixedLengthString(maxId, 5);
		code += "-" + end;
		return code;
	}

	/**
	 * 获取实体类对应的表明,如果该实体类使用了baomidou自定义了表明,则返回自定义的表明
	 * @param clazz
	 * @return
	 */
	public static String getTableName(Class clazz){
		//	获取注解值
		Annotation annotation = clazz.getAnnotation(TableName.class);
		if(annotation != null){
			String t = ((TableName)annotation).value();
			return t;
		}
		String simpleName = clazz.getSimpleName();
		// 在所有大写字母前加入"-",$0表示匹配到的第一个字符（即该大写字母）
		simpleName = simpleName.replaceAll("[A-Z]", "_$0");
		// 替换第一个"-"
		simpleName = simpleName.replaceFirst("_", "");
		// 转为小写
		simpleName = simpleName.toLowerCase();
		return simpleName;
	}

	public static String getFileName(String name){
		String simpleName = name;
		// 在所有大写字母前加入"-",$0表示匹配到的第一个字符（即该大写字母）
		simpleName = simpleName.replaceAll("[A-Z]", "_$0");
		// 转为小写
		simpleName = simpleName.toLowerCase();
		return simpleName;
	}
}
